<?php
/**
 * SQL生成に関するユーティリティクラス
 * @package Apm
 * @author 
 * @since 2011/11/04
 */
class Apm_SqlUtil{
	
	
    /**
	* SQLのin句を作成する関数
	*
	* 引数の条件でin句における括弧以下の情報を作成する
	* @access	public
	* @param	$bindVariables		string			バインド変数名
	* @param	$conditionArray		string Array[]	in句の制約を格納した文字列の一次元配列。
	* @param	$db_params_ref		Array			バインド変数値を格納するDBパラメータの参照			
	* @return	$whereInSql			string			引数で指定した制約を持つin句
	*
	* ※実行上の注意
	*	1.in句の制約数がゼロの場合は、空の文字列を返す
	*	2.$db_paramsは参照渡しで実行しないとエラーとなる！！	
	*
	* 例：
	*	【入力】
	* 	$bindVariables		=	"key"	
	* 	$conditionArray		=	array([0]=>"いち",[1]=>"に",[3]=>"さん")
	* 	$db_params_ref		=	$db_params_ref
	*
	*	【出力】
	*	$whereInSql 		=	" ( :key_0, :key_1, :key_2)"	 
	*	$db_params_ref		=	array("key_0"=>"いち","key_1"=>"に","key_2"=>"さん")
	*
	*/
	public function generateWhereIn($bindVariables,$conditionArray,&$db_params_ref){

		//変数の宣言
		$whereInSql = ""; 		//in句を格納する変数				
		$index = 0;				//in句で指定する制約の数を格納する

		//in句で指定する制約の数を取得
		$index = count($conditionArray); 
		if($index == 0){
			__log_error(__FILE__, __LINE__, __METHOD__, 'Warning : Apm_SqlUtil->generateWhereIn()内で$conditionArrayが0件のパラメータが渡されました。');
		}		
		
		
		//制約数がゼロの場合は、int句を生成せず空の文字列を返す
		if($index > 0){
			
			if($index > 1000){
				__log_error(__FILE__, __LINE__, __METHOD__, 'Warning : Apm_SqlUtil->generateWhereIn()内でin句に1000件を超えるパラメータが渡されました。');
			}
			
			//【Step1】in句の括弧内を生成
			//in句の第一要素を生成
			$id = $bindVariables . "_0";					//バインド変数名 
			$db_params_ref[$id] = $conditionArray[0];		//DBパラメータにバインド変数値をセット
			$whereInSql .= " :" . $id;							//SQLにバインド変数の項目を追加
			
			//【Step2】in句の第二要素目以降
			// in句の条件数-1回分ループ
			for($i = 1 ; $i < $index; $i++){
				$id = $bindVariables . "_" . $i; 
				$db_params_ref[$id] = $conditionArray[$i];
				$whereInSql .= " , :" . $id . " ";
			}
			
			//【Step3】in句の第二要素目以降
			$whereInSql =  " ( " . $whereInSql . " ) ";
		}	
		return $whereInSql;
	}
	


    /**
	* 条件にあう市区町村を選択するWhere句を返す
	*
	* [1] 概要
	*
	* 　　引数で指定された市区町村に該当するか判定するWhere句を返す
	*　 市区町村は、都道府県CDと市区町村CDを結合した5桁の数値で指定される
	* 
	* [2] 引数
	*
	* @access	public
	* @param	$todoufukenBindVariables		string			都道府県バインド変数名	
	* @param	$shikucyousonBindVariables		string			市区町村のバインド変数名	
	* @param	$todoufukenColum				string			都道府県CDを格納したカラム名
	* @param	$shikuchousonColum				string 			市区町村CDを格納したカラム名
	* @param	$townCdArry						string array[]	市区町村を示す5桁の数値リストを格納した配列
	* @param	$db_params_ref					Array[]			バインド変数値を格納するDBパラメータの参照			
	* @return	$whereTownSql					string			引数で指定した制約を持つwhere句
	*
	* [3] 実行上の注意
	*
	*	1.市区町村は、都道府県CDと市区町村CDを結合した5桁の数値で指定される
	*   2.市区町村の条件が一つのときは、下記のように括弧がつかないwhereを返す
	*　　
	*		$whereTownSql = " M01_TODOUFUKEN_CD = :PrefCd_01 AND M01_SHIKUCHOUSON_CD = :TownCd_01 "
	*
	* [4] 例
	*
	*	【入力】
	* 　$todoufukenBindVariables	= "PrefCd"
	* 　$shikucyousonBindVariables	= "TownCd"	
	* 　$todoufukenColums			= "M01_TODOUFUKEN_CD"		
	* 　$shikuchousonColums			= "M01_SHIKUCHOUSON_CD"
	* 　$townCdArry					= array([0]=>"00000",[1]=>"01001",[2]=>"01002")					
	* 	$db_params_ref				= $db_params_ref
	*
	*	【出力】
	*	$whereInSql 		=	" ( 
	*								( M01_TODOUFUKEN_CD = :PrefCd_01 AND M01_SHIKUCHOUSON_CD = :TownCd_02) 
	*							  OR ( M01_TODOUFUKEN_CD = :PrefCd_02 AND M01_SHIKUCHOUSON_CD = :TownCd_02) "	
	*							  OR ( M01_TODOUFUKEN_CD = :PrefCd_03 AND M01_SHIKUCHOUSON_CD = :TownCd_03) "	
	*							  ) "
	*
	*	$db_params_ref		=	array("PrefCd_0"=>"00","PrefCd_1"=>"02","PrefCd_2"=>"01"
	*								 ,"TondCd_0"=>"000","TondCd_1"=>"001","TondCd_2"=>"002")
	*/	
	public function createWhereTown($todoufukenBindVariables,$shikucyousonBindVariables,$todoufukenColum,$shikuchousonColum,$townCdArray,&$db_params_ref)
	{
		//変数の宣言
		$whereTownSql = ""; 		//where句を格納する変数			
		$index = 0;					//条件となる市区町村数の数を格納する

		//条件となる市区町村の数を取得
		$index = count($townCdArray); 	
		if($index == 0){
			__log_error(__FILE__, __LINE__, __METHOD__, 'Warning : Apm_SqlUtil->createWhereTown()内で$townCdArrayが0件のパラメータが渡されました。');
		}	
		
		//市区町村数がゼロの場合は、where句を生成せず空の文字列を返す
		if($index > 0){
			
			//【Step1】where句の括弧内を生成
			//where句の第一条件を生成
			$prefId = $todoufukenBindVariables . "_0";						//都道府県CDのバインド変数名 
			$townId = $shikucyousonBindVariables . "_0";					//市区町村CDのバインド変数名 
						
			$db_params_ref[$prefId] = substr($townCdArray[0],0,2);						//DBパラメータに都道府県CDのバインド変数値をセット
			$db_params_ref[$townId] = substr($townCdArray[0],2,3);						//DBパラメータに市区町村CDのバインド変数値をセット			
			$whereTownSql = " " . $todoufukenColum . " = :" . $prefId . " AND  " . $shikuchousonColum . " = :" . $townId . " ";
						
			//【Step2】where句の第二条件目以降		
			if($index > 1){
			
				//要素2個以上ある場合は、第１要素を括弧で囲う
				$whereTownSql = " ( " . $whereTownSql . " ) ";
				// where句の条件数-1回分ループ
				for($i = 1 ; $i < $index; $i++){
							
					$prefId = $todoufukenBindVariables . "_" . $i;						//都道府県CDのバインド変数名 		
					$townId = $shikucyousonBindVariables . "_" . $i;					//市区町村CDのバインド変数名 			
					$db_params_ref[$prefId] = substr($townCdArray[$i],0,2);						//DBパラメータに都道府県CDのバインド変数値をセット
					$db_params_ref[$townId] = substr($townCdArray[$i],2,3);						//DBパラメータに市区町村CDのバインド変数値をセット			
					$whereTownSql .= " OR ( " . $todoufukenColum . " = :" . $prefId ." AND  " . $shikuchousonColum . " = :" . $townId . " ) ";
				}
				//　AND句を連結したOR句全体を括弧で囲う
				$whereTownSql = " ( " . $whereTownSql . " ) ";
			}
		}	

		return $whereTownSql;
    }
}
?>